四舍五入
1 2 3 4
| print(round(1.5, 1)) print(round(1.23, 1)) print(round(-1.27, 1)) print(round(-1.25361, 3))
|
传给 round()
函数的 ndigits
参数可以是负数,这种情况下, 舍入运算会作用在十位、百位、千位等上面。比如
1 2 3 4
| print(round(1627731, -1)) print(round(1627731, -2)) print(round(1627731, -3)) print(round(1627731, -4))
|
不要将舍入和格式化输出搞混淆了。 如果你的目的只是简单的输出一定宽度的数,你不需要使用 round()
函数。 而仅仅只需要在格式化的时候指定精度即可。比如:
1 2 3 4
| print(format(1.23456, '0.2f')) print(format(1.23456, '0.3f')) print(format(1.23456, '0.4f'))
|
精确的浮点数运算
浮点数的一个普遍问题是它们并不能精确的表示十进制数
1 2 3 4 5 6 7
| >>> a = 4.2 >>> b = 2.1 >>> a + b 6.300000000000001 >>> (a + b) == 6.3 False >>>
|
使用 decimal
解决问题,并且 decimal
模块中的 localcontext
还可以设置保留小数位数。计算效率上,原生的浮点数计算要快的多。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from decimal import Decimal, localcontext
d1 = Decimal("4.2") d2 = Decimal("2.1") print(d1 + d2)
d3 = Decimal("0.3") d4 = Decimal("0.7") print(d3/d4)
with localcontext() as ltx: ltx.prec = 3 print(d3 / d4)
print(round(d3 / d4, 3))
|
进制转换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| x = 1234
print(bin(x))
print(oct(x))
print(hex(x))
print(format(x, "b"))
print(format(x, "o"))
print(format(x, "x"))
|
无穷大与NaN
1 2 3 4 5 6 7 8 9
| print(float("inf")) print(float("-inf")) print(float('nan'))
import math
print(math.isinf(float("-inf"))) print(math.isnan(float('nan')))
|
分数
1 2 3 4 5 6 7 8 9 10 11 12
| from fractions import Fraction
f1 = Fraction(5, 4) f2 = Fraction(7, 16)
print(f1 + f2) print(f1 * f1)
print(float(f1 + f2)) print(float(f1 * f2))
|
随机数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import random
values = [1, 2, 3, 4, 5, 6]
print(random.choices(values))
print(random.sample(values, 3))
random.shuffle(values) print(values)
print(random.randint(0, 10))
print(random.random())
|
字符串与日期的转换
String 转 DateTime
1 2 3
| In [16]: time_str = '2018-02-28 14:00:00' In [18]: datetime.datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S") Out[18]: datetime.datetime(2018, 2, 28, 14, 0)
|
DateTime 转 String
1 2 3
| In [19]: date_time = datetime.datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S") In [20]: date_time.strftime("%Y-%m-%d %H:%M:%S") Out[20]: '2018-02-28 14:00:00'
|
strptime()
的性能要比你想象中的差很多,如果知道时间字符串的格式,例如 YYYY-MM-DD
,那么可以像下面这样实现一个解析函数。
1 2 3 4
| from datetime import datetime def parse_ymd(s): year_s, mon_s, day_s = s.split('-') return datetime(int(year_s), int(mon_s), int(day_s))
|